#include <queue>
using namespace std;
// 1. 枚举所有路径的起点                       BFS广度优先
// 2. 计算以某一个节点为起点的满足条件的路径的个数    DFS深度优先

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution
{
public:
    // DFS + BFS
    int pathSum(TreeNode *root, int targetSum)
    {
        // 使用层序变量，去寻找每一个节点的路径和
        queue<TreeNode *> q;
        TreeNode *cur = root;
        int total = 0;
        q.push(root);
        while (!q.empty())
        {
            cur = q.front();
            q.pop();
            total += dfs(cur, 0, targetSum);
            if (cur)
            {
                q.push(cur->left);
                q.push(cur->right);
            }
        }
        return total;
    }
    // 1. 广度优先搜索， 查找每一个节点的路径总和 == target
    int dfs(TreeNode *root, long long cur_sum, int targetSum)
    {
        if (!root) // 终止条件
            return 0;
        cur_sum += root->val;     // 当前路径和
        int cnt = 0;              // 满足条件的路径数量
        if (cur_sum == targetSum) // 满足条件
            cnt++;
        cnt += dfs(root->left, cur_sum, targetSum);  // 继续往下走
        cnt += dfs(root->right, cur_sum, targetSum); //
        return cnt;
    }
};